//编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性： 
//
// 
// 每行的元素从左到右升序排列。 
// 每列的元素从上到下升序排列。 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21
//,23,26,30]], target = 5
//输出：true
// 
//
// 示例 2： 
//
// 
//输入：matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21
//,23,26,30]], target = 20
//输出：false
// 
//
// 
//
// 提示： 
//
// 
// m == matrix.length 
// n == matrix[i].length 
// 1 <= n, m <= 300 
// -109 <= matrix[i][j] <= 109 
// 每行的所有元素从左到右升序排列 
// 每列的所有元素从上到下升序排列 
// -109 <= target <= 109 
// 
// Related Topics 数组 二分查找 分治 矩阵 
// 👍 858 👎 0

package com.cute.leetcode.editor.cn;
public class SearchA2dMatrixIi {
    public static void main(String[] args) {
        Solution solution = new SearchA2dMatrixIi().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    /**
     * 我感觉这样没有利用到这个矩阵的性质
     * 思路是这样的：可以将矩阵看成几层小矩阵，每个小矩阵的第一个元素都是最小的
     * 先对第一个元素进行判断，不然就对当前小矩阵的首行首列进行遍历，没查到就跳到下一个小矩阵的第一个元素
     */
    public boolean mySearchMatrix(int[][] matrix, int target) {
        if (matrix[0][0]>target) return false;
        int row = 0;
        int col = 0;
        while (row< matrix.length&&col<matrix[0].length){
            if (matrix[row][col] == target) return true;
            for (int i = col+1; i < matrix[0].length ; i++) {
                if (matrix[row][i] == target) return true;
            }
            for (int i = row+1; i < matrix.length ; i++) {
                if (matrix[i][col] == target) return true;
            }
            row++;col++;
        }
        return false;
    }

    /**
     * 我觉的一个很棒的题解，取到最右上角的元素，真的秀啊
     * 因为右上角的元素是当前行最大的，是当前列最小的
     * 让右上角的val与target进行比较
     * if val == target 返回true就完了
     * if val > target 放弃当前列的所有元素
     * if val < target 放弃当前行的所有元素
     */
    public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix[0][0]>target) return false;
        int row = 0;//第一行
        int col = matrix[0].length-1;//最后一列
        while (row < matrix.length && col>=0){
            if (matrix[row][col]==target)return true;
            else if (matrix[row][col]<target) row++;
            else col--;
        }
        return false;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}